#include <REGX51.H>
#include <absacc.h>
#include <definicje.h>
#include <prototypy.h>
	  
xdata	 byte zaszyfrowane[2048];
	  
data	 byte klucz[8]={0,0,0,0,0,0,0,0};
data	 byte klucz2[8]={35,83,13,58,234,29,121,49};	//losowane naprawde losowo - slowo honoru!
data	 byte bufor[16];  
data	 byte pobrane;
data 	 int  zapisane;
data  	 byte rozmiar[4]={2,0,4,8};
bdata  	 bit  klucz_obecny=0;
bdata  	 bit  klucz_wczytany=0;	   	  
bdata	 bit  koniec_transmisji=0;




void main(void)
{
	byte wybor=1,i=0;
	int wcisniety_klawisz;
	przerwania_Init();
	timer_Init();
	com_Init();
	lcd_Init();
	




	//MENU GLOWNE
	while(1)
	{
		//przerwania: timer0, generalne		 
		przerwania_Off();
		przerwania_Timer0_On();
		przerwania_On();
		w7segm_Init();
		//timery
		timer_0_Zeruj();
		timer_0_UstawTryb(1);
		timer_0_Start();
		lcd_Wyczysc();


		//wyswietlam klucz
		if(klucz_wczytany) for(i=0;i!=8;i++){lcd_PiszHex(klucz[i]);}
		else lcd_PiszTekst("----------------");
		switch(wybor)
		{
			case 1:
				lcd_PiszTekst("1.Wczytaj klucz");
			break;
			case 2:
				lcd_PiszTekst("2.Wpisz klucz");
			break;
			case 3:
				lcd_PiszTekst("3.Kasuj klucz");
			break;
			case 4:
				lcd_PiszTekst("4.Szyfruj");
			break;
			case 5:
				lcd_PiszTekst("5.Deszyfruj");
			break;
			default:
				lcd_Wyczysc();
				lcd_PiszTekst("LOL ERROR zly wybor");
				while(1);
			break;
		}
		wcisniety_klawisz=czekaj_na_klawisz(0xFF);//czekaj na dowolny
		
		switch(wcisniety_klawisz)
		{
			case 0xC: //gora
				wybor--;
				if(wybor==0) wybor=5;
			break;

			case 0xD: //dol
				wybor++;
				if(wybor==6) wybor=1;
			break;

			case 0xF: //enter
				switch(wybor)
				{
					case 1:
						if(sprawdz_analog()) wczytaj_klucz();
						else {lcd_NowaLinia(); lcd_PiszTekst("-Podlacz klucz!-");  beep(); czekaj(2);} 
					break;

					case 2:
						wpisz_klucz();
					break;

					case 3:
						klucz_wczytany=0;
					break;

					case 4:
						szyfruj();
					break;

					case 5:
						deszyfruj();
					break;
				}
			break;
		} 
	}
}



void beep(void)
{
	#pragma asm
		clr p1.5
		clr a
		mov b,a
		
		w1:				
		djnz acc,w1
		djnz b,w1

		setb p1.5
	#pragma endasm
}


void wpisz_klucz(void)
{		
	byte i=0, cyfra1, cyfra2;
	bit klucz_poprawny=0;
	
	while(!klucz_poprawny)
	{
		lcd_Wyczysc();
		lcd_NowaLinia();
		lcd_PiszTekst("#Wprowadz klucz#");
		XBYTE[LCDWC]=0x0F;//0x0C bylo - wlaczam kursor
		while(XBYTE[LCDRC]&0x08);
		
		while(i!=8)
		{
			cyfra1=czekaj_na_klawisz(0xFF);
			lcd_PiszCyfreHex(cyfra1);
			cyfra2=czekaj_na_klawisz(0xFF);
			lcd_PiszCyfreHex(cyfra1);
			klucz[i]=(cyfra1<<4)|cyfra2;
			i++;
		}
		cyfra1=0;
		while(i!=0)
		{
			i--;
			cyfra1 |= klucz[i];
		}
		if(cyfra1!=0) klucz_wczytany=klucz_poprawny=1;
		else
		{
			lcd_PiszTekst("   Zly klucz!   ");
			beep();
			czekaj(1);
		}
	}
}

void czekaj(byte i)
{
	int j=0;
	do
	{
		do {j++;} while(j!=0);
		i--;
	}
	while(i!=0);
}
